package com.zx._06_JVM.chapter_04_metrics.tool;

import cn.hutool.core.util.RuntimeUtil;
import com.zx._06_JVM.chapter_04_metrics.model.JstatGcResult;
import com.zx.common.util.ThreadUtil;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class JStat extends JavaTool {

    /**
     * 执行 jstat -gc pid
     * @param pid
     * @param count    执行几次
     * @param interval 每次的间隔，单位秒
     */
    public static List<JstatGcResult> gc(String pid, int count, int interval) throws Exception {
        String cmd = "jstat -gc " + pid;
        log.info("JStat#gc start, cmd={}", cmd);

        List<JstatGcResult> resList = new ArrayList<>();
        for (int i = 0; i < count; i++) {
            log.info("JStat#gc, idx = {}", i);
            // 执行命令
            List<String> strings = RuntimeUtil.execForLines(cmd);
            // 解析数据
            Map<String, String> lineMap = parseGcStat(strings);
            // 转为对象
            JstatGcResult res = toModel(lineMap, JstatGcResult.class);
            res.setDate(new Date());
            res.setHeapc(res.getS1c() + res.getS0c() + res.getEc() + res.getOc() + res.getPc());
            res.setHeapu(res.getS1u() + res.getS0u() + res.getEu() + res.getOu() + res.getPu());
            res.setHeapp(percent(res.getHeapu(), res.getHeapc()));

            resList.add(res);
            ThreadUtil.sleep(interval);
        }
        log.info("JStat#gc done");

        return resList;
    }

}
